package net.yla.smartbus.core.constants;

import com.alibaba.fastjson.annotation.JSONType;
import net.yla.smartbus.core.exception.EnumNotFoundException;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 区域类型枚举
 * @author MaXin
 * @date 2019/7/18 0018 08:40
 */
//TODO 缺少代码
@JSONType(serializeEnumAsJavaBean = true)
public enum AreaTypeEnum {

    /**
     * 停靠站
     */
    BUSSTOP(0, "停靠站"),

    /**
     * 终点站
     */
    LASTSTOP(1, "终点站"),

    /**
     * 停车场
     */
    PARK(2, "停车场"),

    /**
     * 加油站
     */
    PETROLSTATION(3, "加油站"),

    /**
     * 起点站
     */
    STARTSTOP(4, "起点站"),

    /**
     * 限速区域
     */
    SPEEDLIMITAREA(5, "限速区域"),

    /**
     * 普通区域
     */
    TESTAREA(6, "普通区域"),

    /**
     * 服务点
     */
    SERVICEPOINT(7, "服务点"),

    /**
     * 收费站
     */
    TOLLSTATION(8, "收费站"),

    /**
     * 危险点
     */
    DANGERPOINT(9, "危险点"),

    /**
     * 限制区域
     */
    RESTRICTEDAREA(10, "限制区域");

    private int code;
    private String desc;

    private AreaTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }


    private static final Map<Integer, AreaTypeEnum> BY_VALUE_MAP = new LinkedHashMap<>();

    static {
        for (AreaTypeEnum areaTypeEnum : AreaTypeEnum.values()) {
            BY_VALUE_MAP.put(areaTypeEnum.getCode(), areaTypeEnum);
        }
    }

    /**
     * 根据code查询对应的处理结果类型枚举
     */
    public static AreaTypeEnum convertCode2Enum(int code) throws EnumNotFoundException {
        if (!BY_VALUE_MAP.containsKey(code)) {
            throw new EnumNotFoundException("枚举对应的code" + code + "不存在");
        }
        return BY_VALUE_MAP.get(code);
    }

    /**
     * 根据枚举name查询对应的处理结果类型枚举
     */
    public static AreaTypeEnum convertStr2Enum(String str) throws EnumNotFoundException {
        try {
            return AreaTypeEnum.valueOf(str);
        } catch (Exception e) {
            throw new EnumNotFoundException("枚举对应常量" + str + "不存在");
        }
    }

    public int getCode() {
        return code;
    }

//    public void setCode(int code) {
//        this.code = code;
//    }
}
